package main

import (
	"fmt"
	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
	socketio "github.com/googollee/go-socket.io"
	. "xm_shop/database"
	. "xm_shop/routers"
)

func main() {
	r := gin.Default()
	// 配置gin允许跨域请求
	r.Use(cors.Default())
	InitSession(r) // 注意session要先配置, 因为下面要用到session
	InitMysql()
	InitAdminRouters(r)
	InitDefaultRouter(r)
	// 配置静态路由
	r.Static("/static", "./static")
	// 初始化socket
	InitSocket(r)
	r.Run(":8001")
}

// 初始化socketio
func InitSocket(r *gin.Engine) {
	// 配置socket.io服务对象
	server := socketio.NewServer(nil)
	// 监听客户端连接事件
	server.OnConnect("/", func(s socketio.Conn) error {
		s.SetContext("")
		fmt.Println("connected:", s.ID())
		return nil
	})
	// 监听客户端广播
	server.OnEvent("/", "notice", func(s socketio.Conn, msg string) {
		fmt.Println("notice:", msg)
		s.Emit("reply", "have--:"+msg)
		// 通过命名空间进行广播  广播和单独发送可以同时存在
		server.BroadcastToNamespace("/", "reply", "这是一个广播")
	})
	// 启动socket服务
	go server.Serve()

	// 如果你要把初始化socket封装成一个函数, 这句应该去掉, 因为函数一执行完毕就触发server.Close()将服务销毁了
	//defer server.Close()

	// 配置socket路由
	r.GET("/socket.io/", gin.WrapH(server)) // 等效http.Handle("/socket.io/", server)
	r.POST("/socket.io/", gin.WrapH(server))
}
